package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.CargueVO;
import com.cs.beneficios.business.model.RegNoProcesadosVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.Types;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;

import java.util.Properties;



public class CargueDAO
{

  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;
  private Properties props = new Properties();  /* String to hold file name */

/**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */

 public CargueDAO( ConnectionFactory cf ) {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }

  /**
   * TABLA TCS_CARGUE_LOTE
   */

    public Collection findArchivoCargueByCriterea(CargueVO criterea) throws SQLException
    {
      String query = " SELECT lote.nombre nombre, lote.codigo lote, lote.archivo archivo, "+
                     " DECODE(lote.tipo_terminacion,'N','Normal','E','Error') terminacion, "+
                     " vfl_codigo.nombre valor, lote.usuario_crea usuario, lote.fecha_crea fechaCrea, " +
                     " beneficios.fcs_ben_getArea(lote.usuario_crea) dependencia, paoyer.fcs_getTotal(lote.codigo) total," +
                     " paoyer.fcs_getCargados(lote.codigo) cargados"+
                     " FROM paoyer.TCS_LOTE_CARGUE lote, paoyer.TCS_VALOR_FLEXIBLE VFL_CODIGO "+
                     " WHERE LOTE.VFL_CODIGO = VFL_CODIGO.CODIGO ";


      if(criterea.getNombre() != null && !criterea.getNombre().equalsIgnoreCase("")){
          query += "and upper(lote.nombre) like upper('%"+criterea.getNombre()+"%') ";
      }
      if(criterea.getCode() != null && !criterea.getCode().equalsIgnoreCase("")){
        query += " and lote.codigo = '"+criterea.getCode()+"' ";
      }
      if(criterea.getFechaFinal() != null && !criterea.getFechaFinal().equals("") &&
        criterea.getFechaInicial() != null && !criterea.getFechaInicial().equals("")){
            query += " and lote.fecha_crea between to_date('"+criterea.getFechaInicial()+"','dd/mm/yyyy') and " +
                     " to_date('"+criterea.getFechaFinal()+"','dd/mm/yyyy') ";
        }
        
      query += " order by lote.codigo ";
      
      ResultSet rst = null;
      ArrayList archivos = new ArrayList();
      //System.out.println(query);
      rst = cf.getRecordsRset(query,null,conn);
      CargueVO cargue = null;
      
      while(rst.next()){
        cargue = new CargueVO();
        cargue.setNombre(rst.getString("nombre"));
        cargue.setCode(rst.getString("lote"));
        cargue.setArchivo(rst.getString("archivo"));
        cargue.setTipo_terminacion(rst.getString("terminacion"));
        cargue.setVflcodigo(rst.getString("valor"));
        cargue.setFechaCreacion(rst.getString("fechaCrea").substring(0, 10));
        cargue.setUsuarioCreador(rst.getString("usuario"));
        cargue.setDependencia(rst.getString("dependencia"));
        cargue.setTotalRegistros(rst.getString("total"));
        cargue.setTotalCargados(rst.getString("cargados"));
        //String totales[] = getTotalRegistros(cargue.getCode());
        //cargue.setTotalRegistros(totales[0]);
        //cargue.setTotalCargados(totales[1]);
        
        
        archivos.add(cargue);
        cargue = null;
      }
      rst.close();
      
      return archivos;

    }


   public String[] getTotalRegistros(String codeLote) throws SQLException
   {
      String strSql = " SELECT count(codigo) total FROM paoyer.TCS_API_CARGUE WHERE LCA_CODIGO = "+codeLote;
      //System.out.println(strSql);
      ResultSet rs = cf.getRecordsRset(strSql,null,conn);
      String retorno[] = new String[2];
      if(rs.next())
      {
        retorno[0]=rs.getString("total");
        strSql = " SELECT count(codigo) totalCargados FROM paoyer.TCS_API_CARGUE WHERE LCA_CODIGO = "+codeLote+
                 " and estado = 'C'";
        //System.out.println(strSql);
        rs = cf.getRecordsRset(strSql,null,conn);
        if(rs.next())
        {
          retorno[1]=rs.getString("totalCargados");
        }else
        {
          retorno[1]="0";
        }
      }else
      {
        retorno[0]="0";
        retorno[1]="0";
      }
      
      rs.close();
      return retorno;
   }

   public String[] ingresarCargue(CargueVO criterea, String user,String terminal, String fecha) throws SQLException
   {

   String strSql = " SELECT NOMBRE FROM paoyer.TCS_LOTE_CARGUE WHERE NOMBRE = UPPER(?) ";
   String strPar1[] = {criterea.getNombre().trim()};
   ResultSet rst = null;
   rst = cf.getRecordsRset(strSql,strPar1,conn);
   CargueVO cargue = null;

   while(rst.next()){
     cargue = new CargueVO();
    cargue.setNombre(rst.getString("NOMBRE"));
   }

   rst.close();
   String retorno[] = new String[2];
   retorno[0] = "false";
   if (cargue != null){
      retorno[0]="false";
      return retorno;

   }else{
      String query = " INSERT INTO paoyer.TCS_LOTE_CARGUE (CODIGO,NOMBRE,VFL_CODIGO,ARCHIVO, "+
                     " USUARIO_CREA,TERMINAL_CREA,FECHA_CREA,USUARIO_MODIFICA,TERMINAL_MODIFICA,FECHA_MODIFICA)  "+
                     " VALUES(paoyer.SCS_LOTE_CARGUE.NEXTVAL,UPPER(?),?,UPPER(?),"+
                     " '"+user+"','"+terminal+"',to_date('"+fecha+"','dd/mm/rrrr'), "+
                     " '"+user+"','"+terminal+"',to_date('"+fecha+"','dd/mm/rrrr'))";
                       
      String strPar[] = {criterea.getNombre().trim(),criterea.getVflcodigo(),criterea.getArchivo()};

      int i = cf.execSql(query,strPar,conn);
      if(i>0)
      {
        query = "select max(codigo) codigo from paoyer.TCS_LOTE_CARGUE ";
        ResultSet rs = cf.getRecordsRset(query,null,conn);
        if(rs.next())
        {
          retorno[0]="true";
          retorno[1]=rs.getString("codigo");
          return retorno;
        }else
        {
          retorno[0] = "false";
          return retorno;
        }
      }
      else
      {
        retorno[0] = "false";
        return retorno;
      }

   }

 }


    public Connection getConn()
  {
    return conn;
  }

 public String convertPath(String path)
 {
   char sep = (char)92;
   char sep1 = (char)47;
   return path.replace(sep,sep1);
 }
 
    public boolean ValidateDelete(Long codeUser, String nameUser,String groupUserName, String codeLote) throws SQLException 
     {
       String query = "SELECT COUNT(1) cantidad FROM paoyer.TCS_LOTE_CARGUE ";
       
       if((Object)codeUser != null)
       {
         query +=" where ('ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' " +
                 "OR usuario_crea ='"+nameUser+"' ) and codigo ="+codeLote;
       } else {
         return false;
       }
       
       ResultSet rst = null;
       rst = cf.getRecordsRset(query,null,conn);
       rst.next();
       
       if(rst.getInt("cantidad") > 0){
            rst.close();
            return true;
       } else {
           rst.close();
           return false;
       }
     }

  /*
  public boolean uploadFile(int codeLoteCargue, byte[] fileData)
  {
        
        String              sqlText                 = null;
        Statement           stmt                    = null;
        ResultSet           rset                    = null;
        CLOB                xmlDocument             = null;

        OutputStream        clobOutputStream        = null;
        OutputStreamWriter  clobOutputStream1       = null;
        byte[]              byteBuffer;
        int                 bytesRead               = 0;

    try
    {
        ResultSet rs = cf.getRecordsRset("select archivo from paoyer.TCS_LOTE_CARGUE where codigo = "+codeLoteCargue,null,conn);
        Connection con = cf.getConnectionWithDriver();
        con.setAutoCommit(false);
        stmt = con.createStatement();

        sqlText =
            "UPDATE paoyer.TCS_LOTE_CARGUE set ARCHIVO_EN_WEB = EMPTY_CLOB() where codigo = "+codeLoteCargue;
        stmt.executeUpdate(sqlText);

        sqlText =
            "SELECT ARCHIVO_EN_WEB " +
            "FROM   paoyer.TCS_LOTE_CARGUE " +
            "WHERE  codigo = " + codeLoteCargue+
            " FOR UPDATE";
        
        rset = stmt.executeQuery(sqlText);
        rset.next();
        
        xmlDocument = ((OracleResultSet)rset).getCLOB("ARCHIVO_EN_WEB");
        
        byteBuffer = fileData;
        
        
        clobOutputStream = xmlDocument.getAsciiOutputStream();
        
        clobOutputStream1 = new OutputStreamWriter(clobOutputStream,"windows-1252");
        
        
        String strcargue = new String(byteBuffer,"windows-1252");
                
        bytesRead = new String(byteBuffer).length();
        clobOutputStream1.write(new String(byteBuffer), 0, bytesRead);
        

        clobOutputStream1.close();

        con.commit();
        rset.close();
        stmt.close();
        con.close();

        return moveToApiCargue(codeLoteCargue);

    }catch(Exception e)
    {
      e.printStackTrace();
      return false;
    }
  }*/
  
  
    public int uploadFile(int codeLoteCargue, byte[] fileData)
    {
        PreparedStatement pstmt = null;
        try{
        	//David
        	Connection con = cf.getConnection();
        	//Fin David
            //Connection con = cf.getConnWithDriverClob();
            //String strData = new String(fileData);
			String strData = new String(fileData,"ISO-8859-1");
            
            String sqlText ="UPDATE paoyer.TCS_LOTE_CARGUE set ARCHIVO_EN_WEB = ? where codigo = "+codeLoteCargue;
            int moveac = 0;
            System.err.println("sqlText: "+ sqlText);
			System.err.println("strData: "+ strData);
            String strPar[] = {strData};
            int a = cf.execSql(sqlText,strPar,con);
            con.commit();
            con.close();
            moveac = moveToApiCargue(codeLoteCargue);
            if (moveac >= 0){
                sqlText =  "delete from paoyer.TCS_API_CARGUE where lca_codigo = "+codeLoteCargue;
                a = cf.execSql(sqlText,null,conn);
                sqlText =  "delete from paoyer.TCS_LOTE_CARGUE where codigo = "+codeLoteCargue;
                a = cf.execSql(sqlText,null,conn);
            }
            return moveac;
        }catch(Exception e)
        {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
			System.err.println("ERROR SQL EXECP" + e);
            return 0;
        }
    }
    
    public int getBadRecord(int codeLote){
          String strSql = " SELECT count(codigo) FROM paoyer.TCS_API_CARGUE WHERE LCA_CODIGO = "+codeLote;

         try{
          ResultSet rs = cf.getRecordsRset(strSql,null,conn);

          if(rs.next())
          {
            return rs.getInt(1) + 1;
          }else{
            return 0;
          }
         }catch(Exception e) {
             return 0;
         }
    }
  
  
  public int moveToApiCargue(int codeLoteCargue){

    String strSql =  "delete from paoyer.tcs_api_cargue where lca_codigo = "+codeLoteCargue;
    
    try{
        int reg = cf.execSql(strSql,null,conn);
    
        strSql = "{call paoyer.PQCS_CARGUE.p_pobla_datos_de_clob(?)}" ;
        CallableStatement cs = conn.prepareCall(strSql) ;
        // Set the value for the IN parameter
            cs.setInt(1, codeLoteCargue);
        // Execute the stored procedure
            cs.execute();
    
          ResultSet rs = cf.getRecordsRset(" SELECT * FROM paoyer.TCS_API_CARGUE WHERE lca_codigo = "+codeLoteCargue,null,conn);
    
         if(rs.next()){
            return -1;
         } else {
            return 0;
          }
    }catch(Exception e){
        if(e.getMessage().startsWith("ORA-20500: Pqcs_Cargue.P_POBLA_DATOS_DE_CLOB-Inserta la linea en TCS_API_CARGUE")){
            return getBadRecord(codeLoteCargue);
        }else{
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
        }
        return 0;
    }
  }

  public boolean moveToCargarDatos(int codeLoteCargue, String tipoCargue,
                                   String user, String terminal, String usrGroup,
                                   String usrCode) throws SQLException {

    String strSql = "select codigo from paoyer.TCS_API_CARGUE where lca_codigo="+codeLoteCargue;
    ResultSet rs = cf.getRecordsRset(strSql,null,conn);
    if(rs.next())
    {
      CallableStatement cs = null;
      if(!tipoCargue.equalsIgnoreCase("") && tipoCargue.equals("BENEFICIARIOS"))
      {
        strSql = "{call Pcs_Car_Ben_Per(?,?,?)}" ;
         cs = conn.prepareCall(strSql) ;
      }else if(!tipoCargue.equalsIgnoreCase("") && tipoCargue.equals("BENEFICIOS"))
      {
        strSql = "{call Pcs_Car_Ben_Otor(?,?,?,?)}" ;
        cs = conn.prepareCall(strSql) ;
        cs.setString(4,usrGroup);
      }
       //CallableStatement cs = conn.prepareCall(strSql) ;
        cs.setInt(1, codeLoteCargue);
        cs.setString(2, user);
        cs.setString(3, terminal);
        cs.execute();
        return true;
    }else return false;

  }

  public boolean DeleteFile(int codeLoteCargue) throws SQLException {

    String strSql = "{call paoyer.PQCS_CARGUE.p_borrar_datos(?)}";
    CallableStatement cs = conn.prepareCall(strSql) ;

    cs.setInt(1, codeLoteCargue);
    cs.execute();

    int archivo = cf.execSql("delete from paoyer.tcs_lote_cargue where codigo = "+codeLoteCargue,null,conn);

    ResultSet rs =cf.getRecordsRset("select * from paoyer.tcs_api_cargue where lca_codigo = "+codeLoteCargue,null,conn);

    if(rs.next()){
      return false;
    }else{
      return true;
    }

  }

  public Collection regNoProcesados(String lote,String tipo) throws SQLException
  {
    String query = "";
    if(tipo != null && !tipo.equalsIgnoreCase(""))
    {
      if(tipo.equals("BENEFICIARIOS"))
      {
        query = "SELECT lca_codigo, comentario,c_a1 tipo,c_a2 numero "+
                   "FROM paoyer.tcs_api_cargue api "+
                   "WHERE lca_codigo= "+lote+
                   " AND api.ESTADO = 'E'";
      }else if(tipo.equals("BENEFICIOS"))
      {
        query = "SELECT lca_codigo, comentario,c_a3 tipo,c_a4 numero "+
                   "FROM paoyer.tcs_api_cargue api "+
                   "WHERE lca_codigo= "+lote+
                   " AND api.ESTADO = 'E'";
      }
    }
    RegNoProcesadosVO reg = null;
    ResultSet rs = cf.getRecordsRset(query,null,conn);
    Collection regs = new LinkedList();
    while(rs.next())
    {
      reg = new RegNoProcesadosVO();
      reg.setCode(rs.getString("lca_codigo"));
      reg.setComentario(rs.getString("comentario"));
      reg.setTipoDocumento(rs.getString("tipo"));
      reg.setNumeroDocumento(rs.getString("numero"));
      regs.add(reg);
    }
    return regs;
  }
  
  public int DeleteCargue(String codeLote) throws SQLException {
      String query = "SELECT COUNT(1) CANTIDAD " +
                     " FROM TCS_BEN_BENEFICIO_OTORGADO " +
                     " WHERE CAMPO_N1="+codeLote;
                     
      ResultSet rst = null;
      rst = cf.getRecordsRset(query, null, conn);
      
      rst.next();
      
      if(rst.getInt("CANTIDAD") > 0){
          String strSQL = "{call beneficios.PCS_BEN_DELETE_BOT("+codeLote+",?)}";
          CallableStatement cs = conn.prepareCall(strSQL);
          cs.registerOutParameter(1, Types.INTEGER);
          cs.execute();
          
          return cs.getInt(1);
      }

      return 0;
  }
  
 /* public static void main(String[] args)
  {
    ConnectionFactory cf = new ConnectionFactory("paoyer","paoyer");
    CargueDAO cargueDAO = new CargueDAO(cf);
    //boolean a = cargueDAO.uploadFile("13","C:/cs/FondoMed.txt");

    boolean a = cargueDAO.uploadFile(116);
  }*/
}